﻿// poj3045 Cow Acrobats.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>


using namespace std;
/*

http://poj.org/problem?id=3045

牛杂技团
时间限制：1000MS 内存限制：65536K
总提交量。10155 被接受。3740
说明

农夫约翰的N头（1 <= N <= 50,000）奶牛（编号为1...N）正计划逃跑并加入马戏团。
它们的蹄子使它们无法走钢丝和在空中荡秋千（它们上次尝试用大炮向外发射牛，结果惨遭失败）。
因此，它们决定练习表演杂技特技。

奶牛们并没有很大的创造力，只想出了一个杂技特技：站在彼此的上面，形成一个有一定高度的垂直堆叠。
奶牛们正试图找出它们应该在这个堆栈中排列的顺序。

N头奶牛中的每一头都有一个相关的重量（1 <= W_i <= 10,000）和强度（1 <= S_i <= 1,000,000,000）。
一头牛倒下的风险等于在她上面的所有牛的总重量（当然不包括她自己的重量）减去她的力量（因此，更强壮的牛有更低的风险）。
你的任务是确定奶牛的排序，使任何奶牛倒塌的最大风险最小。
输入

* 第1行。带有整数N的单行。

* 第2...N+1行。第i+1行用两个隔开空间的整数W_i和S_i描述奶牛i。
输出

* 第1行。一个单一的整数，给出所有奶牛的最大风险，以任何最佳排序使风险最小化。
输入样本

3
10 3
2 5
3 3
样本输出

2
提示

输出细节。

将体重为10的奶牛放在底部。她将承载其他两头牛，所以她倒下的风险是2+3-3=2。其他奶牛的倒塌风险较低。
*/


const int N = 50010;

struct COW {
    int weight; int str;
}cows[N];
int n;

bool cmp(const struct COW& a, const struct COW& b) {
    if (a.weight - b.str <= b.weight - a.str) return true;
    return false;
}

int main()
{
    //cin >> n;
    scanf("%d\n",&n);
    for (int i = 0; i < n; i++) {
        //cin >> cows[i].weight >> cows[i].str;
        scanf("%d%d",&cows[i].weight,&cows[i].str);
    }

    sort(cows, cows + n, cmp);

    int ans = -0x3f3f3f3f; int totalW = 0;
    for (int i = 0; i < n; i++) {
        ans = max(ans, totalW - cows[i].str);
        totalW += cows[i].weight;
    }

    printf("%d\n", ans);

    return 0;
}

